#include <STC15F2K60S2.H>
#include <key.h>
#include <led.h>
#include <seg.h>
#include <ds1302.h>
#include <system.h>
#include <onewire.h>
#include <ultrasonic.h> //超声波测距底层
#include <Uart.h>		//串口底层驱动专用头文件
#include <stdio.h>
#include <nir.h>
#include <lcd1602.h>

// 变量区
// idata unsigned char i;
// 1.led
pdata unsigned char ucLed[] = {0, 0, 0, 0, 0, 0, 1, 1};
// 2.seg
idata unsigned char Seg_Pos;
pdata unsigned char Seg_Buf[] = {10, 10, 10, 10, 10, 10, 10, 10};
pdata unsigned char Seg_Point[] = {0, 0, 0, 0, 0, 0, 0, 0};

// seg显示模式
idata unsigned char seg_mode = 0;	  // 表示显示模式：0-时间，1-温度  2-超声波....
idata unsigned char seg_mode_cnt = 4; // 表示显示模式：0-时间，1-温度  2-超声波.... 3-显示红外编码

// 3.key
idata unsigned char Key_Val, Key_Down, Key_Up, Key_Old;
idata unsigned int Seg_Slow_Down, Key_Slow_Down;
// 4.时钟
pdata unsigned char ucRtc[] = {23, 59, 55}; //{时，分，秒}
bit flag;
idata float wd; // 温度

// 5.超声波
idata int Wave_Data;

// 6.串口变量区
idata unsigned char Uart_Slow_Down;	 // 串口减速专用变量
pdata unsigned char Uart_Recv[20];	 // 串口接收数据储存数组 默认10个字节 若接收数据较长 可更改最大字节数
idata unsigned char Uart_Recv_Index; // 串口接收数组指针
pdata unsigned char Uart_Send[20];	 // 串口接收数据储存数组 默认10个字节 若发送数据较长 可更改最大字节数
idata unsigned char dat;

// 7.红外遥控


// 1.led
void led_proc()
{
	// led_display(ucLed);
}
// 2.seg
void seg_show()
{
			Seg_Buf[0] = 16;
			Seg_Buf[1] = 16;
			Seg_Buf[2] = 16;
			Seg_Buf[3] = 16;
			Seg_Buf[4] = ircode[0] / 16;
			Seg_Buf[5] = ircode[0] % 16;
			Seg_Buf[6] = ircode[2] / 16;
			Seg_Buf[7] = ircode[2] % 16;
}

void seg_proc()
{
//	unsigned char i,j;

	if (Seg_Slow_Down != 0)
		return;
	Seg_Slow_Down = 1;

	flag = !flag;

	switch (seg_mode)
	{
 
	case 0: // 红外
		seg_show();
		dat = ircode[2];//5A
  
			sprintf(Uart_Send, "T = %02X \n", dat); // 发送数据到串口
	
			Uart_Send_String(Uart_Send);
			P2 &= 0x1f;
			sprintf(Uart_Send, "T = %02X", dat);  
			lcd1602_clear();
			lcd1602_write_string(0, 0, Uart_Send);
	
	
	
		break;
	}
}
// 3.key
void key_proc()
{
	if (Key_Slow_Down)
		return;
	Key_Slow_Down = 1;

	Key_Val = keyRead();
	Key_Down = Key_Val & (Key_Val ^ Key_Old);
	Key_Up = Key_Val & (Key_Val ^ Key_Old);
	Key_Old = Key_Val;

	switch (Key_Down)
	{
	case 5:

		if (++seg_mode == seg_mode_cnt)
			seg_mode = 0;

		break;
	case 6:
		InfraredNECSend(0x00,0x0d);
		break;
	}
}
// 4.定时器
// void Timer1_Init(void)		//1毫秒@12.000MHz
//{
//	AUXR &= 0xBF;			//定时器时钟12T模式
//	TMOD &= 0x0F;			//设置定时器模式
//	TL1 = 0x18;				//设置定时初始值
//	TH1 = 0xFC;				//设置定时初始值
//	TF1 = 0;				//清除TF1标志
//	TR1 = 1;				//定时器1开始计时
//		ET1 = 1;      // 使能定时器1中断
//     EA = 1;       // 使能总中断
// }
void Timer0_Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//定时器0为16位自动重装载定时器
	TL0 = 0xCD;		
	TH0 = 0xD4;		
	TF0 = 0;		//清楚定时器0溢出标志位
	TR0 = 1;		//打开定时器0
	ET0=1;			//打开定时器0中断
	EA=1;			//打开总中断
}
//void Timer0_Init(void) // 1毫秒@12.000MHz
//{
//	AUXR &= 0x7F; // 定时器时钟12T模式
//	TMOD &= 0xF0; // 设置定时器模式
//	TL0 = 0x18;	  // 设置定时初始值
//	TH0 = 0xFC;	  // 设置定时初始值
//	TF0 = 0;	  // 清除TF0标志
//	TR0 = 1;	  // 定时器0开始计时

//	ET0 = 1; // 使能定时器0中断
//	EA = 1;	 // 使能总中断
//}
void service1() interrupt 1 
{
	if (++Seg_Slow_Down == 500)
		Seg_Slow_Down = 0;
	if (++Key_Slow_Down == 10)
		Key_Slow_Down = 0;
	if (++Uart_Slow_Down == 200)
		Uart_Slow_Down = 0; // 串口减速专用

	// Read_Rtc(ucRtc);//读取时间

	led_display(ucLed);
	Seg_Pos++;
	if (Seg_Pos % 8 == 0)
		Seg_Pos = 0;
	seg_display(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]);
	
	
		
}

void Delay750ms(void) //@12.000MHz
{
	unsigned char data i, j, k;
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k)
				;
		} while (--j);
	} while (--i);
}

// 5 串口函数
/* 串口处理函数 */
void Uart_Proc()
{
	if (Uart_Slow_Down)
		return;
	Uart_Slow_Down = 1; // 串口减速程序

	if (Uart_Recv_Index == 6)
	{
		if (Uart_Recv[0] == 'L' && Uart_Recv[1] == 'e' && Uart_Recv[2] == 'd' && Uart_Recv[4] == '=')
			ucLed[Uart_Recv[3] - 48] = Uart_Recv[5] - 48;
		Uart_Recv_Index = 0;
	}
}

/* 串口1中断服务函数 */
void Uart1Server() interrupt 4
{
	if (RI == 1) // 串口接收数据
	{
		Uart_Recv[Uart_Recv_Index] = SBUF;
		Uart_Recv_Index++;
		RI = 0;
	}
}

void main()
{
	system_init();
	Timer0_Init();
//	read_t();
//	Delay750ms();

//	Set_Rtc(ucRtc);
	UartInit(); // 串口初始化
	lcd1602_init();
	ISR_Init();
	while (1)
	{
	  key_proc();
		led_proc();
		seg_proc();
		Uart_Proc(); // 串口
		if (irflag) /*显示遥控器ID和按键值*/
			{
				irflag = 0;
			}
	}
}